/*
 * timer.cpp
 *
 *  Created on: 2008-8-15
 *      Author: root
 * 首先设置it_value时间，这个时间就会自动减少，当减少到0时就会产生ITIMER信号，
	然后it_value将设置为it_interval的值重复上述闹钟计时过程。
	而闹钟信号分为三种，ITIMER_REAL、ITIMER_VIRTUAL、ITIMER_PROF
	分别代表了	当系统运行时产生闹钟、当进程在运行时产生闹钟、两种情况下都会产生。
	通常情况下，	只要我们启动了程序闹钟，ITIMER_REAL计时就一定会持续进行；
	如果是ITIMER_VIRTUAL则只有在程序在运行时计时，则在sleep的时候是
	不会产生SIGVTALRM闹钟的。	比如在for循环里加入usleep(500)将只会产生SIGALRM闹钟
 */

#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/time.h>

void sigroutine(int signo) {
        switch (signo) {
                case SIGALRM:
                        printf("Catch a signal -- SIGALRM\n");
                        break;
                case SIGVTALRM:
                        printf("Catch a signal -- SIGVTALRM\n");
                        break;
        }
}

int main(int argc, char ** argv) {
        struct itimerval value,ovalue,value2;

        printf("process id is %d\n",getpid());
        signal(SIGALRM, sigroutine);
        signal(SIGVTALRM, sigroutine);

        value.it_value.tv_sec = 1;
        value.it_value.tv_usec = 0;
        value.it_interval.tv_sec = 1;
        value.it_interval.tv_usec = 0;
        setitimer(ITIMER_REAL, &value, &ovalue); /* 这将每隔1秒钟后产生 SIGALRM 信号 */

        value2.it_value.tv_sec = 0;
        value2.it_value.tv_usec = 500000;
        value2.it_interval.tv_sec = 0;
        value2.it_interval.tv_usec = 500000;
        setitimer(ITIMER_VIRTUAL, &value2, &ovalue); /* 对于在运行的程序，这将每隔0.5秒钟后产生 SIGVTALRM 信号。在sleep时间内是不产生闹钟的 */

        for (;;) ;
}
